///Implementation of Groovey particle List class

#include "gparticle_list.hpp"

GParticle_List::GParticle_List(): rendered(true), updated(false)
{
}////////////////////////////Gparticle List Constructor

void GParticle_List::Give(GParticle_Set& GPSet)
{
    p_sets.push_back(GPSet);
}////////////////////////////Give()

GParticle_Set& GParticle_List::operator[](const int Index)
{
	std::list<GParticle_Set>::iterator i = p_sets.begin();
    for (int k = 0; k < Index; ++k){i++;}
    return *i;
}////////////////////////////overloaded []

void GParticle_List::Create(const GParticle& GPart, const int Amount)
{
    ////Keep it simple. Just make a particle set using as much constructor as possible
    GParticle_Set set(Amount, GPart);
    
    p_sets.push_back(set);
}////////////////////////////Create()

int GParticle_List::getSize() const
{
    return p_sets.size();
}////////////////////////////getSize()

bool GParticle_List::Rendered(){
     return rendered;
}

bool GParticle_List::Updated(){
     return updated;
}
boost::mutex& GParticle_List::renderLock()
{
    return renderAccess;
}////////////////////////////renderLock()

void GParticle_List::renderOpen()
{
    //boost::mutex::scoped_lock rlk(renderAccess);
    //boost::mutex::scoped_lock ulk(updateAccess);
    rendered = true;
    updated = false;
    rdyToUpdate.notify_one();
}////////////////////////////renderOpen()

boost::mutex& GParticle_List::updateLock()
{
    return updateAccess;
}////////////////////////////updateLock()

void GParticle_List::updateOpen()
{
    //boost::mutex::scoped_lock rlk(renderAccess);
    //boost::mutex::scoped_lock ulk(updateAccess);
    rendered = false;
    updated = true;
    rdyToRender.notify_one();
}////////////////////////////updateOpen()

boost::condition& GParticle_List::getRdyToRender()
{
    return rdyToRender;
}

boost::condition& GParticle_List::getRdyToUpdate()
{
    return rdyToUpdate;
}
